package cn.loveq.android.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TimeUtils {
	public static Calendar calendar = Calendar.getInstance();
	private static int[] month = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	private static String TIME_PATTERN = "HH:mm:ss";// 定义标准时间格式
	private static String DATE_PATTERN_1 = "yyyy/MM/dd";// 定义标准日期格式1
	private static String DATE_PATTERN_2 = "yyyy-MM-dd";// 定义标准日期格式2
	private static String DATE_PATTERN_3 = "yyyy/MM/dd HH:mm:ss";// 定义标准日期格式3，带有时间
	private static String DATE_PATTERN_4 = "yyyy/MM/dd HH:mm:ss E";// 定义标准日期格式4，带有时间和星期
	private static String DATE_PATTERN_5 = "yyyy年MM月dd日 HH:mm:ss E";// 定义标准日期格式5，带有时间和星期
	/**
	 * 定义时间类型常量
	 */
	private final static int SECOND = 1;
	private final static int MINUTE = 2;
	private final static int HOUR = 3;
	private final static int DAY = 4;

	/** 
	 * 把一个日期，按照某种格式 格式化输出 
	 * @param date 日期对象 
	 * @param pattern 格式模型 
	 * @return 返回字符串类型 
	 */
	public static String formatDate(Date date, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}

	/** 
	 * 将字符串类型的时间转换为Date类型 
	 * @param str 时间字符串 
	 * @param pattern 格式 
	 * @return 返回Date类型 
	 */
	public Date formatString(String str, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		Date time = null;
		// 需要捕获ParseException异常，如不要捕获，可以直接抛出异常，或者抛出到上层
		try {
			time = sdf.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return time;
	}

	/** 
	 * 将一个表示时间段的数转换为毫秒数 
	 * @param num 时间差数值,支持小数 
	 * @param type 时间类型：1->秒,2->分钟,3->小时,4->天 
	 * @return long类型时间差毫秒数，当为-1时表示参数有错 
	 */
	public long formatToTimeMillis(double num, int type) {
		if (num <= 0)
			return 0;
		switch (type) {
		case SECOND:
			return (long) (num * 1000);
		case MINUTE:
			return (long) (num * 60 * 1000);
		case HOUR:
			return (long) (num * 60 * 60 * 1000);
		case DAY:
			return (long) (num * 24 * 60 * 60 * 1000);
		default:
			return -1;
		}
	}

	/** 
	 * 只输出一个时间中的月份 
	 * @param date 
	 * @return 返回int数值类型 
	 */
	public int getMonth(Date date) {
		Calendar cal = Calendar.getInstance();// 获得一个Calendar实例相当于Date date=new Date()
		return cal.MONTH;
	}

	/** 
	 * 只输出一个时间中的年份 
	 * @param date 
	 * @return 返回数值类型 
	 */
	public int getYear(Date date) {
		Calendar cal = Calendar.getInstance();// 获得一个Calendar实例相当于Date date=new Date()
		return cal.YEAR;
	}

	/** 
	 * 得到一个日期函数的格式化时间 
	 * @param date 日期对象 
	 * @return 
	 */
	public String getTimeByDate(Date date) {
		return formatDate(date, TIME_PATTERN);
	}

	/** 
	 * 获取当前的时间，new Date()获取当前的日期 
	 * @return 
	 */
	public static String getNowTime() {
		return formatDate(new Date(), TIME_PATTERN);
	}

	/** 
	 * 获取某一指定时间的前一段时间 
	 * @param num 时间差数值 
	 * @param type 时间差类型：1->秒,2->分钟,3->小时,4->天 
	 * @param date 参考时间 
	 * @return 返回格式化时间字符串 
	 */
	public String getPreTimeStr(double num, int type, Date date) {
		long nowLong = date.getTime();// 将参考日期转换为毫秒时间
		Date time = new Date(nowLong - formatToTimeMillis(num, type));// 减去时间差毫秒数
		return getTimeByDate(time);
	}

	/** 
	 * 获取某一指定时间的前一段时间 
	 * @param num 时间差数值 
	 * @param type 时间差类型：1->秒,2->分钟,3->小时,4->天 
	 * @param date 参考时间 
	 * @return 返回Date对象 
	 */
	public Date getPreTime(double num, int type, Date date) {
		long nowLong = date.getTime();// 将参考日期转换为毫秒时间
		Date time = new Date(nowLong - formatToTimeMillis(num, type));// 减去时间差毫秒数
		return time;
	}

	/** 
	 * 获取某一指定时间的后一段时间 
	 * @param num 时间差数值 
	 * @param type 时间差类型：1->秒,2->分钟,3->小时,4->天 
	 * @param date 参考时间 
	 * @return 返回格式化时间字符串 
	 */
	public String getNextTimeStr(double num, int type, Date date) {
		long nowLong = date.getTime();// 将参考日期转换为毫秒时间
		Date time = new Date(nowLong + formatToTimeMillis(num, type));// 加上时间差毫秒数
		return getTimeByDate(time);
	}

	/** 
	 * 获取某一指定时间的后一段时间 
	 * @param num 时间差数值 
	 * @param type 时间差类型：1->秒,2->分钟,3->小时,4->天 
	 * @param date 参考时间 
	 * @return 返回Date对象 
	 */
	public Date getNextTime(double num, int type, Date date) {
		long nowLong = date.getTime();// 将参考日期转换为毫秒时间
		Date time = new Date(nowLong + formatToTimeMillis(num, type));// 加上时间差毫秒数
		return time;
	}

	/** 
	 * 得到前几个月的现在 
	 * 利用GregorianCalendar类的set方法来实现 
	 * @param num 
	 * @param date 
	 * @return 
	 */
	public Date getPreMonthTime(int num, Date date) {
		GregorianCalendar gregorianCal = new GregorianCalendar();
		gregorianCal.set(Calendar.MONTH, gregorianCal.get(Calendar.MONTH) - num);
		return gregorianCal.getTime();
	}

	/** 
	 * 得到后几个月的现在时间 
	 * 利用GregorianCalendar类的set方法来实现 
	 * @param num 
	 * @param date 
	 * @return 
	 */
	public Date getNextMonthTime(int num, Date date) {
		GregorianCalendar gregorianCal = new GregorianCalendar();
		gregorianCal.set(Calendar.MONTH, gregorianCal.get(Calendar.MONTH) + num);
		return gregorianCal.getTime();
	}

	/**
	 * 获取当前时间的格式
	 * 
	 * @return 时间格式
	 */
	public static String getFormateCreatedDate() {
		Calendar calendar = Calendar.getInstance();
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int min = calendar.get(Calendar.MINUTE);
		int sec = calendar.get(Calendar.SECOND);
		String created = (hour < 10 ? "0" + hour : String.valueOf(hour)) + ":" + (min < 10 ? "0" + min : String.valueOf(min)) + ":" + (sec < 10 ? "0" + sec : String.valueOf(sec));
		return created;
	}

	public static String cal(int second) {
		int h = 0;
		int d = 0;
		int s = 0;
		int temp = second % 3600;
		if (second > 3600) {
			h = second / 3600;
			if (temp != 0) {
				if (temp > 60) {
					d = temp / 60;
					if (temp % 60 != 0) {
						s = temp % 60;
					}
				} else {
					s = temp;
				}
			}
		} else {
			d = second / 60;
			if (second % 60 != 0) {
				s = second % 60;
			}
		}
		String created = (h < 10 ? "0" + h : String.valueOf(h)) + " : " + (d < 10 ? "0" + d : String.valueOf(d)) + " : " + (s < 10 ? "0" + s : String.valueOf(s));
		return created;
	}

	public static String getFormateCreatedDate(Calendar calendar) {

		String created = calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月" + calendar.get(Calendar.DAY_OF_MONTH) + "日" + calendar.get(Calendar.HOUR_OF_DAY) + "时"
				+ calendar.get(Calendar.MINUTE) + "分";
		return created;
	}

	/**
	 * 获取指定时间的格式
	 * 
	 * @return 时间格式
	 */
	public static String getFormateSpecifyDate(Date date) {
		String specifyDate = date.getYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日" + date.getHours() + "时" + date.getMinutes() + "分";
		return specifyDate;

	}

	/**
	 * 处理日期格式，把具体时间改为XX月XX日
	 * 
	 * @param date
	 * @return
	 */
	public static String handleFormateDate(String date) {
		int year = date.indexOf("年");
		int day = date.indexOf("日");
		return date.substring(year + 1, day + 1);
	}

	/**
	 * 用数字转换标准格式
	 * 
	 * @param newTimeUserInSec
	 * @return
	 */
	public static String getTimeUsedFormat(long newTimeUserInSec) {
		int min = (int) newTimeUserInSec / 60;
		int sec = (int) (newTimeUserInSec % 60);
		return (min < 10 ? "0" + min : String.valueOf(min)) + ":" + (sec < 10 ? "0" + sec : String.valueOf(sec));
	}

	/**
	 * 获取当前年月
	 * @return XX月XX日%
	 */
	public static String getCurrentYearMonth() {
		Calendar calendar = Calendar.getInstance();
		String created = calendar.get(Calendar.YEAR) + "年" + (calendar.get(Calendar.MONTH) + 1) + "月%";
		return created;
	}

	/**
	 * 获取当前月份的日数
	 * @return
	 */
	public static int getCurrentMonthCounts() {
		int year = calendar.get(Calendar.YEAR);
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			month[2] = 29;
		} else {
			month[2] = 28;
		}
		System.out.println(month[calendar.get(Calendar.MONTH)]);
		return month[calendar.get(Calendar.MONTH)];
	}

}
